perm filename TANGLE.PAS[WEB,DEK]2 blob
sn#623636 filedate 1981-11-19 generic text, type T, neo UTF8
{2}{4}{$C-,A+,D-}{[$C+,D+]}PROGRAM TANGLE(INPUT,OUTPUT,POOL,TTY);
LABEL 9999;CONST{7}BUFSIZE=100;MAXBYTES=30000;MAXTOKS=65535;
MAXNAMES=4000;MAXTEXTS=2000;HASHSIZE=353;LONGESTNAME=300;LINELENGTH=72;
OUTBUFSIZE=144;STACKSIZE=50;MAXIDLENGTH=12;UNAMBIGLENGT=7;
TYPE{12}ASCIIFILE=FILE OF CHAR;ASCIICODE=0..127;{25}EIGHTBITS=0..255;
SIXTEENBITS=0..65535;{27}NAMEPOINTER=0..MAXNAMES;
{30}TEXTPOINTER=0..MAXTEXTS;{64}OUTPUTSTATE=RECORD ENDFIELD:SIXTEENBITS;
BYTEFIELD:SIXTEENBITS;NAMEFIELD:NAMEPOINTER;REPLFIELD:TEXTPOINTER;END;
VAR{13}POOL:ASCIIFILE;{15}BUFFER:ARRAY[0..BUFSIZE]OF ASCIICODE;
{17}PHASEONE:BOOLEAN;{26}BYTEMEM:PACKED ARRAY[0..MAXBYTES]OF ASCIICODE;
TOKMEM:PACKED ARRAY[0..MAXTOKS]OF EIGHTBITS;
BYTESTART:ARRAY[0..MAXNAMES]OF SIXTEENBITS;
TOKSTART:ARRAY[0..MAXTEXTS]OF SIXTEENBITS;
LINK:ARRAY[0..MAXNAMES]OF SIXTEENBITS;
ILK:ARRAY[0..MAXNAMES]OF SIXTEENBITS;
EQUIV:ARRAY[0..MAXNAMES]OF SIXTEENBITS;
TEXTLINK:ARRAY[0..MAXTEXTS]OF SIXTEENBITS;{28}NAMEPTR:NAMEPOINTER;
STRINGPTR:NAMEPOINTER;BYTEPTR:0..MAXBYTES;{31}TEXTPTR:TEXTPOINTER;
TOKPTR:0..MAXTOKS;{MAXTOKPTR:0..MAXTOKS;}{36}IDFIRST:0..BUFSIZE;
IDLOC:0..BUFSIZE;DOUBLECHARS:0..BUFSIZE;
HASH,CHOPHASH:ARRAY[0..HASHSIZE]OF SIXTEENBITS;
CHOPPEDID:ARRAY[0..UNAMBIGLENGT]OF ASCIICODE;
{51}MODULE:ARRAY[0..LONGESTNAME]OF ASCIICODE;
{56}LASTUNNAMED:TEXTPOINTER;{65}CURSTATE:OUTPUTSTATE;
STACK:ARRAY[1..STACKSIZE]OF OUTPUTSTATE;STACKPTR:0..STACKSIZE;
{67}BRACELEVEL:EIGHTBITS;{71}CURVAL:INTEGER;
{79}OUTBUF:ARRAY[0..OUTBUFSIZE]OF ASCIICODE;OUTPTR:0..OUTBUFSIZE;
BREAKPTR:0..OUTBUFSIZE;SEMIPTR:0..OUTBUFSIZE;{80}OUTSTATE:EIGHTBITS;
OUTVAL,OUTAPP:INTEGER;OUTSIGN:ASCIICODE;
{85}OUTCONTRIB:ARRAY[1..LINELENGTH]OF ASCIICODE;{107}PAGE:SIXTEENBITS;
LINE:SIXTEENBITS;LIMIT:0..BUFSIZE;LOC:0..BUFSIZE;INPUTHASENDE:BOOLEAN;
{115}CURMODULE:NAMEPOINTER;{126}NEXTCONTROL:EIGHTBITS;
{133}CURREPLTEXT:TEXTPOINTER;{139}MODULECOUNT:0..12287;
{147}{TROUBLESHOOT:BOOLEAN;DDT:SIXTEENBITS;DD:SIXTEENBITS;
DEBUGCYCLE:INTEGER;DEBUGSKIPPED:INTEGER;}{18}{PROCEDURE DEBUGHELP;
FORWARD;}{19}PROCEDURE ERROR;VAR J:0..OUTBUFSIZE;K,L:0..BUFSIZE;
BEGIN IF PHASEONE THEN{20}BEGIN WRITELN(TTY,'. (p.',PAGE:0,',l.',LINE:0,
')');IF LOC>=LIMIT THEN L:=LIMIT ELSE L:=LOC;
FOR K:=1 TO L DO IF BUFFER[K-1]=9 THEN WRITE(TTY,' ')ELSE WRITE(TTY,CHR(
BUFFER[K-1]));WRITELN(TTY,'');FOR K:=1 TO L DO WRITE(TTY,' ');
FOR K:=L+1 TO LIMIT DO WRITE(TTY,CHR(BUFFER[K-1]));WRITE(TTY,' ');
END ELSE{21}BEGIN WRITELN(TTY,'. (l.',LINE:0,')');
FOR J:=1 TO OUTPTR DO WRITE(TTY,CHR(OUTBUF[J-1]));WRITE(TTY,'...');END;
{DEBUGHELP;}END;{22}PROCEDURE QUIT;BEGIN GOTO 9999;END;
PROCEDURE INITIALIZE;VAR{37}H:0..HASHSIZE;
BEGIN{14}REWRITE(POOL,'','/O');
IF NOT EOF(POOL)THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Couldn''t open the pool file.');END;QUIT;END;
{29}NAMEPTR:=1;STRINGPTR:=128;BYTEPTR:=1;BYTESTART[0]:=1;
BYTESTART[1]:=1;{32}TOKPTR:=1;TEXTPTR:=1;TOKSTART[0]:=1;TOKSTART[1]:=1;
{34}ILK[0]:=0;EQUIV[0]:=0;
{38}FOR H:=0 TO HASHSIZE-1 DO BEGIN HASH[H]:=0;CHOPHASH[H]:=0;END;
{57}LASTUNNAMED:=0;TEXTLINK[0]:=0;{122}MODULE[0]:=32;
{148}{TROUBLESHOOT:=TRUE;DEBUGCYCLE:=1;DEBUGSKIPPED:=0;
TROUBLESHOOT:=FALSE;DEBUGCYCLE:=99999;}END;
{11}FUNCTION OPENINPUT:BOOLEAN;BEGIN RESET(INPUT,'','/E/I/O');
OPENINPUT:=EOF(INPUT);END;{16}FUNCTION INPUTLN:BOOLEAN;BEGIN READLN;
IF EOF(INPUT)THEN INPUTLN:=FALSE ELSE BEGIN LIMIT:=0;
BUFFER[0]:=ORD(INPUT↑);
IF BUFFER[0]<>12 THEN WHILE BUFFER[LIMIT]<>13 DO IF LIMIT=BUFSIZE-1 THEN
BEGIN BUFFER[LIMIT]:=13;BEGIN WRITELN(TTY);
WRITE(TTY,'! Input line too long');END;ERROR;
END ELSE BEGIN LIMIT:=LIMIT+1;GET(INPUT);
IF EOF(INPUT)THEN BUFFER[LIMIT]:=13 ELSE BUFFER[LIMIT]:=ORD(INPUT↑);END;
INPUTLN:=TRUE;END;END;{35}PROCEDURE PRINTID(P:NAMEPOINTER);
VAR K:0..MAXBYTES;
BEGIN IF P>=NAMEPTR THEN WRITE(TTY,'IMPOSSIBLE')ELSE FOR K:=BYTESTART[P]
TO BYTESTART[P+1]-1 DO WRITE(TTY,CHR(BYTEMEM[K]));END;
{39}FUNCTION IDLOOKUP(T:EIGHTBITS):NAMEPOINTER;LABEL 31,32;
VAR C:EIGHTBITS;I:0..BUFSIZE;H:0..HASHSIZE;K:0..MAXBYTES;L:0..BUFSIZE;
P,Q:NAMEPOINTER;S:0..UNAMBIGLENGT;BEGIN L:=IDLOC-IDFIRST;
{40}H:=BUFFER[IDFIRST];I:=IDFIRST+1;
WHILE I<IDLOC DO BEGIN H:=(H+H+BUFFER[I])MOD HASHSIZE;I:=I+1;END;
{41}P:=HASH[H];
WHILE P<>0 DO BEGIN IF BYTESTART[P+1]-BYTESTART[P]=L THEN{42}BEGIN I:=
IDFIRST;K:=BYTESTART[P];
WHILE(I<IDLOC)AND(BUFFER[I]=BYTEMEM[K])DO BEGIN I:=I+1;K:=K+1;END;
IF I=IDLOC THEN GOTO 31;END;P:=LINK[P];END;P:=NAMEPTR;LINK[P]:=HASH[H];
HASH[H]:=P;31:;
IF(P=NAMEPTR)OR(T<>0)THEN{43}BEGIN IF((P<>NAMEPTR)AND(T<>0)AND(ILK[P]=0)
)OR((P=NAMEPTR)AND(T=0)AND(BUFFER[IDFIRST]<>34))THEN{44}BEGIN I:=IDFIRST
;S:=0;H:=0;
WHILE(I<IDLOC)AND(S<UNAMBIGLENGT)DO BEGIN IF BUFFER[I]<>24 THEN BEGIN IF
BUFFER[I]>=97 THEN CHOPPEDID[S]:=BUFFER[I]-32 ELSE CHOPPEDID[S]:=BUFFER[
I];H:=(H+H+CHOPPEDID[S])MOD HASHSIZE;S:=S+1;END;I:=I+1;END;
CHOPPEDID[S]:=0;END;
IF P<>NAMEPTR THEN{45}BEGIN IF ILK[P]=0 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! This identifier has already appeared');ERROR;END;
{46}Q:=CHOPHASH[H];
IF Q=P THEN CHOPHASH[H]:=EQUIV[P]ELSE BEGIN WHILE EQUIV[Q]<>P DO Q:=
EQUIV[Q];EQUIV[Q]:=EQUIV[P];END;END ELSE BEGIN WRITELN(TTY);
WRITE(TTY,'! This identifier was defined before');ERROR;END;ILK[P]:=T;
END ELSE{47}BEGIN IF(T=0)AND(BUFFER[IDFIRST]<>34)THEN{48}BEGIN Q:=
CHOPHASH[H];WHILE Q<>0 DO BEGIN{49}BEGIN K:=BYTESTART[Q];S:=0;
WHILE(K<BYTESTART[Q+1])AND(S<UNAMBIGLENGT)DO BEGIN C:=BYTEMEM[K];
IF C<>24 THEN BEGIN IF C>=97 THEN C:=C-32;
IF CHOPPEDID[S]<>C THEN GOTO 32;S:=S+1;END;K:=K+1;END;
IF(K=BYTESTART[Q+1])AND(CHOPPEDID[S]<>0)THEN GOTO 32;BEGIN WRITELN(TTY);
WRITE(TTY,'! Identifier conflict with ');END;
FOR K:=BYTESTART[Q]TO BYTESTART[Q+1]-1 DO WRITE(TTY,CHR(BYTEMEM[K]));
ERROR;Q:=0;32:END;Q:=EQUIV[Q];END;EQUIV[P]:=CHOPHASH[H];CHOPHASH[H]:=P;
END;IF BYTEPTR+L>MAXBYTES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','byte memory',' capacity exceeded');ERROR;QUIT;
END;IF NAMEPTR=MAXNAMES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','name',' capacity exceeded');ERROR;QUIT;END;
I:=IDFIRST;K:=BYTEPTR;WHILE I<IDLOC DO BEGIN BYTEMEM[K]:=BUFFER[I];
K:=K+1;I:=I+1;END;BYTEPTR:=K;NAMEPTR:=NAMEPTR+1;BYTESTART[NAMEPTR]:=K;
IF BUFFER[IDFIRST]<>34 THEN ILK[P]:=T ELSE{50}BEGIN ILK[P]:=1;
IF L-DOUBLECHARS=2 THEN EQUIV[P]:=BUFFER[IDFIRST+1]+32768 ELSE BEGIN
EQUIV[P]:=STRINGPTR+32768;STRINGPTR:=STRINGPTR+1;
WRITE(POOL,CHR(31+L-DOUBLECHARS));I:=IDFIRST+1;
WHILE I<IDLOC DO BEGIN WRITE(POOL,CHR(BUFFER[I]));
IF(BUFFER[I]=34)OR(BUFFER[I]=64)THEN I:=I+2 ELSE I:=I+1;END;END;END;END;
END;IDLOOKUP:=P;END;{52}FUNCTION MODLOOKUP(L:SIXTEENBITS):NAMEPOINTER;
LABEL 31;VAR C:(LESS,EQUAL,GREATER,PREFIX,EXTENSION);J:0..LONGESTNAME;
K:0..MAXBYTES;P:NAMEPOINTER;Q:NAMEPOINTER;BEGIN C:=GREATER;Q:=0;
P:=ILK[0];WHILE P<>0 DO BEGIN{54}BEGIN K:=BYTESTART[P];C:=EQUAL;J:=1;
WHILE(K<BYTESTART[P+1])AND(J<=L)AND(MODULE[J]=BYTEMEM[K])DO BEGIN K:=K+1
;J:=J+1;END;
IF K=BYTESTART[P+1]THEN IF J>L THEN C:=EQUAL ELSE C:=EXTENSION ELSE IF J
>L THEN C:=PREFIX ELSE IF MODULE[J]<BYTEMEM[K]THEN C:=LESS ELSE C:=
GREATER;END;Q:=P;
IF C=LESS THEN P:=LINK[Q]ELSE IF C=GREATER THEN P:=ILK[Q]ELSE GOTO 31;
END;{53}IF BYTEPTR+L>MAXBYTES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','byte memory',' capacity exceeded');ERROR;QUIT;
END;IF NAMEPTR=MAXNAMES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','name',' capacity exceeded');ERROR;QUIT;END;
P:=NAMEPTR;IF C=LESS THEN LINK[Q]:=P ELSE ILK[Q]:=P;LINK[P]:=0;
ILK[P]:=0;C:=EQUAL;FOR J:=1 TO L DO BYTEMEM[BYTEPTR+J-1]:=MODULE[J];
BYTEPTR:=BYTEPTR+L;NAMEPTR:=NAMEPTR+1;BYTESTART[NAMEPTR]:=BYTEPTR;;
31:IF C<>EQUAL THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Incompatible module names');ERROR;END;P:=0;END;
MODLOOKUP:=P;END;{55}FUNCTION PREFIXLOOKUP(L:SIXTEENBITS):NAMEPOINTER;
LABEL 31;VAR C:(LESS,EQUAL,GREATER,PREFIX,EXTENSION);COUNT:0..MAXNAMES;
J:0..LONGESTNAME;K:0..MAXBYTES;P:NAMEPOINTER;Q:NAMEPOINTER;
R:NAMEPOINTER;BEGIN Q:=0;P:=ILK[0];COUNT:=0;R:=0;
WHILE P<>0 DO BEGIN{54}BEGIN K:=BYTESTART[P];C:=EQUAL;J:=1;
WHILE(K<BYTESTART[P+1])AND(J<=L)AND(MODULE[J]=BYTEMEM[K])DO BEGIN K:=K+1
;J:=J+1;END;
IF K=BYTESTART[P+1]THEN IF J>L THEN C:=EQUAL ELSE C:=EXTENSION ELSE IF J
>L THEN C:=PREFIX ELSE IF MODULE[J]<BYTEMEM[K]THEN C:=LESS ELSE C:=
GREATER;END;
IF C=LESS THEN P:=LINK[P]ELSE IF C=GREATER THEN P:=ILK[P]ELSE BEGIN R:=P
;COUNT:=COUNT+1;Q:=ILK[P];P:=LINK[P];END;IF P=0 THEN BEGIN P:=Q;Q:=0;
END;END;IF COUNT<>1 THEN IF COUNT=0 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Name does not match');ERROR;END ELSE BEGIN WRITELN(TTY);
WRITE(TTY,'! Ambiguous prefix');ERROR;END;PREFIXLOOKUP:=R;END;
{59}PROCEDURE STORETWOBYTE(X:SIXTEENBITS);
BEGIN IF TOKPTR+2>MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=X DIV 256;TOKMEM[TOKPTR+1]:=X MOD 256;TOKPTR:=TOKPTR+2;
END;{60}{PROCEDURE PRINTREPL(P:TEXTPOINTER);VAR K:0..MAXTOKS;
A:SIXTEENBITS;
BEGIN IF P>=TEXTPTR THEN WRITE(TTY,'BAD')ELSE BEGIN K:=TOKSTART[P];
WHILE K<TOKSTART[P+1]DO BEGIN A:=TOKMEM[K];
IF A>=128 THEN[61]BEGIN K:=K+1;
IF A<168 THEN BEGIN A:=(A-128)*256+TOKMEM[K];PRINTID(A);
IF BYTEMEM[BYTESTART[A]]=34 THEN WRITE(TTY,'"')ELSE WRITE(TTY,' ');
END ELSE IF A<208 THEN BEGIN WRITE(TTY,'@<');
PRINTID((A-168)*256+TOKMEM[K]);WRITE(TTY,'@>');
END ELSE BEGIN A:=(A-208)*256+TOKMEM[K];
WRITE(TTY,'@{',A:0,'@',CHR(126));END;
END ELSE[62]CASE A OF 9:WRITE(TTY,'@{');10:WRITE(TTY,'@',CHR(126));
12:WRITE(TTY,'@''');13:WRITE(TTY,'#');64:WRITE(TTY,'@@');
OTHERS:WRITE(TTY,CHR(A))END;K:=K+1;END;END;END;
}{69}PROCEDURE PUSHLEVEL(P:NAMEPOINTER);
BEGIN IF STACKPTR=STACKSIZE THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','stack',' capacity exceeded');ERROR;QUIT;
END ELSE BEGIN STACK[STACKPTR]:=CURSTATE;STACKPTR:=STACKPTR+1;
CURSTATE.NAMEFIELD:=P;CURSTATE.REPLFIELD:=EQUIV[P];
CURSTATE.BYTEFIELD:=TOKSTART[CURSTATE.REPLFIELD];
CURSTATE.ENDFIELD:=TOKSTART[CURSTATE.REPLFIELD+1];END;END;
{70}PROCEDURE POPLEVEL;LABEL 10;
BEGIN IF TEXTLINK[CURSTATE.REPLFIELD]=0 THEN BEGIN IF ILK[CURSTATE.
NAMEFIELD]=3 THEN{76}BEGIN{IF TOKPTR>MAXTOKPTR THEN MAXTOKPTR:=TOKPTR;
}NAMEPTR:=NAMEPTR-1;TEXTPTR:=TEXTPTR-1;TOKPTR:=TOKSTART[TEXTPTR];
{BYTEPTR:=BYTEPTR-1;}END;
END ELSE IF TEXTLINK[CURSTATE.REPLFIELD]<MAXTEXTS THEN BEGIN CURSTATE.
REPLFIELD:=TEXTLINK[CURSTATE.REPLFIELD];
CURSTATE.BYTEFIELD:=TOKSTART[CURSTATE.REPLFIELD];
CURSTATE.ENDFIELD:=TOKSTART[CURSTATE.REPLFIELD+1];GOTO 10;END;
STACKPTR:=STACKPTR-1;IF STACKPTR>0 THEN CURSTATE:=STACK[STACKPTR];
10:END;{72}FUNCTION GETOUTPUT:SIXTEENBITS;LABEL 20,30;VAR A:SIXTEENBITS;
B:EIGHTBITS;BAL:SIXTEENBITS;
BEGIN 20:IF STACKPTR=0 THEN A:=0 ELSE BEGIN IF CURSTATE.BYTEFIELD=
CURSTATE.ENDFIELD THEN BEGIN POPLEVEL;GOTO 20;END;
A:=TOKMEM[CURSTATE.BYTEFIELD];CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;
IF A<128 THEN BEGIN IF A=13 THEN{77}BEGIN PUSHLEVEL(NAMEPTR-1);GOTO 20;
END;END ELSE BEGIN A:=(A-128)*256+TOKMEM[CURSTATE.BYTEFIELD];
CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;
IF A<10240 THEN{74}BEGIN CASE ILK[A]OF 0:BEGIN CURVAL:=A;A:=130;END;
1:BEGIN CURVAL:=EQUIV[A]-32768;A:=128;END;2:BEGIN PUSHLEVEL(A);GOTO 20;
END;
3:BEGIN{75}WHILE(CURSTATE.BYTEFIELD=CURSTATE.ENDFIELD)AND(STACKPTR>0)DO
POPLEVEL;
IF(STACKPTR=0)OR(TOKMEM[CURSTATE.BYTEFIELD]<>40)THEN BEGIN BEGIN WRITELN
(TTY);WRITE(TTY,'! No parameter given for ');END;PRINTID(A);ERROR;
GOTO 20;END;{78}BAL:=1;CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;
WHILE TRUE DO BEGIN B:=TOKMEM[CURSTATE.BYTEFIELD];
CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;
IF B=13 THEN STORETWOBYTE(NAMEPTR+32767)ELSE BEGIN IF B>=128 THEN BEGIN
BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=B;TOKPTR:=TOKPTR+1;END;B:=TOKMEM[CURSTATE.BYTEFIELD];
CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;
END ELSE CASE B OF 40:BAL:=BAL+1;41:BEGIN BAL:=BAL-1;
IF BAL=0 THEN GOTO 30;END;
39:REPEAT BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=B;TOKPTR:=TOKPTR+1;END;B:=TOKMEM[CURSTATE.BYTEFIELD];
CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;UNTIL B=39;OTHERS:END;
BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=B;TOKPTR:=TOKPTR+1;END;END;END;30:;
EQUIV[NAMEPTR]:=TEXTPTR;ILK[NAMEPTR]:=2;
{IF BYTEPTR=MAXBYTES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','byte memory',' capacity exceeded');ERROR;QUIT;
END;BYTEMEM[BYTEPTR]:=35;BYTEPTR:=BYTEPTR+1;
}IF NAMEPTR=MAXNAMES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','name',' capacity exceeded');ERROR;QUIT;END;
NAMEPTR:=NAMEPTR+1;BYTESTART[NAMEPTR]:=BYTEPTR;
IF TEXTPTR=MAXTEXTS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','text',' capacity exceeded');ERROR;QUIT;END;
TEXTLINK[TEXTPTR]:=0;TEXTPTR:=TEXTPTR+1;TOKSTART[TEXTPTR]:=TOKPTR;;
PUSHLEVEL(A);GOTO 20;END;OTHERS:BEGIN WRITELN(TTY);
WRITE(TTY,'! This can''t happen (','output',')');ERROR;QUIT;
END END END ELSE IF A<20480 THEN{73}BEGIN A:=A-10240;
IF EQUIV[A]<>0 THEN PUSHLEVEL(A)ELSE IF A<>0 THEN BEGIN BEGIN WRITELN(
TTY);WRITE(TTY,'! Not present: <');END;PRINTID(A);WRITE(TTY,'>');ERROR;
END;GOTO 20;END ELSE BEGIN CURVAL:=A-20480;A:=129;END;END;END;
{IF TROUBLESHOOT THEN DEBUGHELP;}GETOUTPUT:=A;END;
{82}PROCEDURE FLUSHBUFFER;VAR K:0..OUTBUFSIZE;B:0..OUTBUFSIZE;
BEGIN B:=BREAKPTR;
IF(SEMIPTR<>0)AND(OUTPTR-SEMIPTR<=LINELENGTH)THEN BREAKPTR:=SEMIPTR;
FOR K:=1 TO BREAKPTR DO WRITE(CHR(OUTBUF[K-1]));WRITELN;LINE:=LINE+1;
IF LINE MOD 100=0 THEN WRITE(TTY,'.');
IF BREAKPTR<OUTPTR THEN BEGIN IF OUTBUF[BREAKPTR]=32 THEN BREAKPTR:=
BREAKPTR+1;FOR K:=BREAKPTR TO OUTPTR-1 DO OUTBUF[K-BREAKPTR]:=OUTBUF[K];
END;OUTPTR:=OUTPTR-BREAKPTR;BREAKPTR:=B-BREAKPTR;SEMIPTR:=0;
IF OUTPTR>LINELENGTH THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Long line must be truncated');ERROR;END;OUTPTR:=LINELENGTH;
END;END;{84}PROCEDURE APPVAL(V:INTEGER);VAR K:0..OUTBUFSIZE;
BEGIN K:=OUTBUFSIZE;REPEAT OUTBUF[K]:=V MOD 10;V:=V DIV 10;K:=K-1;
UNTIL V=0;REPEAT K:=K+1;BEGIN OUTBUF[OUTPTR]:=OUTBUF[K]+48;
OUTPTR:=OUTPTR+1;END;UNTIL K=OUTBUFSIZE;END;
{86}PROCEDURE SENDOUT(T:EIGHTBITS;V:SIXTEENBITS);LABEL 20;
VAR K:0..LINELENGTH;
BEGIN{87}20:CASE OUTSTATE OF 1:IF T<>3 THEN BEGIN BREAKPTR:=OUTPTR;
IF T=2 THEN BEGIN OUTBUF[OUTPTR]:=32;OUTPTR:=OUTPTR+1;END;END;
2:BEGIN BEGIN OUTBUF[OUTPTR]:=44-OUTAPP;OUTPTR:=OUTPTR+1;END;
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;BREAKPTR:=OUTPTR;END;
3,4:BEGIN{88}IF OUTVAL<0 THEN BEGIN OUTBUF[OUTPTR]:=45;OUTPTR:=OUTPTR+1;
END ELSE IF OUTSIGN>0 THEN BEGIN OUTBUF[OUTPTR]:=OUTSIGN;
OUTPTR:=OUTPTR+1;END;APPVAL(ABS(OUTVAL));
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;;OUTSTATE:=OUTSTATE-2;GOTO 20;END;
5:{89}BEGIN IF(T=3)OR({90}((T=2)AND(V=3)AND(((OUTCONTRIB[1]=68)AND(
OUTCONTRIB[2]=73)AND(OUTCONTRIB[3]=86))OR((OUTCONTRIB[1]=77)AND(
OUTCONTRIB[2]=79)AND(OUTCONTRIB[3]=68))))OR((T=0)AND((V=42)OR(V=47))))
THEN BEGIN{88}IF OUTVAL<0 THEN BEGIN OUTBUF[OUTPTR]:=45;
OUTPTR:=OUTPTR+1;
END ELSE IF OUTSIGN>0 THEN BEGIN OUTBUF[OUTPTR]:=OUTSIGN;
OUTPTR:=OUTPTR+1;END;APPVAL(ABS(OUTVAL));
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;;OUTSIGN:=43;OUTVAL:=OUTAPP;
END ELSE OUTVAL:=OUTVAL+OUTAPP;OUTSTATE:=3;GOTO 20;END;
0:IF T<>3 THEN BREAKPTR:=OUTPTR;OTHERS:END;
IF T<>0 THEN FOR K:=1 TO V DO BEGIN OUTBUF[OUTPTR]:=OUTCONTRIB[K];
OUTPTR:=OUTPTR+1;END ELSE BEGIN OUTBUF[OUTPTR]:=V;OUTPTR:=OUTPTR+1;END;
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;
IF(T=0)AND(V=59)THEN BEGIN SEMIPTR:=OUTPTR;BREAKPTR:=OUTPTR;END;
IF T>=2 THEN OUTSTATE:=1 ELSE OUTSTATE:=0 END;
{91}PROCEDURE SENDSIGN(V:INTEGER);
BEGIN CASE OUTSTATE OF 2,4:OUTAPP:=OUTAPP*V;3:BEGIN OUTAPP:=V;
OUTSTATE:=4;END;5:BEGIN OUTVAL:=OUTVAL+OUTAPP;OUTAPP:=V;OUTSTATE:=4;END;
OTHERS:BEGIN BREAKPTR:=OUTPTR;OUTAPP:=V;OUTSTATE:=2;END END;END;
{92}PROCEDURE SENDVAL(V:INTEGER);LABEL 666,10;
BEGIN CASE OUTSTATE OF 1:BEGIN{95}IF(OUTPTR=BREAKPTR+3)OR((OUTPTR=
BREAKPTR+4)AND(OUTBUF[BREAKPTR]=32))THEN IF((OUTBUF[OUTPTR-3]=68)AND(
OUTBUF[OUTPTR-2]=73)AND(OUTBUF[OUTPTR-1]=86))OR((OUTBUF[OUTPTR-3]=77)AND
(OUTBUF[OUTPTR-2]=79)AND(OUTBUF[OUTPTR-1]=68))THEN GOTO 666;OUTSIGN:=32;
OUTSTATE:=3;OUTVAL:=V;BREAKPTR:=OUTPTR;END;
0:BEGIN{94}IF(OUTPTR=BREAKPTR+1)AND((OUTBUF[BREAKPTR]=42)OR(OUTBUF[
BREAKPTR]=47))THEN GOTO 666;OUTSIGN:=0;OUTSTATE:=3;OUTVAL:=V;
BREAKPTR:=OUTPTR;END;{93}2:BEGIN OUTSIGN:=43;OUTSTATE:=3;
OUTVAL:=OUTAPP*V;END;3:BEGIN OUTSTATE:=5;OUTAPP:=V;END;
4:BEGIN OUTSTATE:=5;OUTAPP:=OUTAPP*V;END;5:BEGIN OUTVAL:=OUTVAL+OUTAPP;
OUTAPP:=V;END;OTHERS:GOTO 666 END;GOTO 10;
666:{96}IF V>=0 THEN BEGIN IF OUTSTATE=1 THEN BEGIN BREAKPTR:=OUTPTR;
BEGIN OUTBUF[OUTPTR]:=32;OUTPTR:=OUTPTR+1;END;END;APPVAL(V);
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;OUTSTATE:=1;
END ELSE BEGIN BEGIN OUTBUF[OUTPTR]:=40;OUTPTR:=OUTPTR+1;END;
BEGIN OUTBUF[OUTPTR]:=45;OUTPTR:=OUTPTR+1;END;APPVAL(-V);
BEGIN OUTBUF[OUTPTR]:=41;OUTPTR:=OUTPTR+1;END;
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;OUTSTATE:=0;END;10:END;
{98}PROCEDURE SENDTHEOUTPU;LABEL 2,21,22;VAR CURCHAR:EIGHTBITS;
K:0..LINELENGTH;J:0..MAXBYTES;N:INTEGER;
BEGIN WHILE STACKPTR>0 DO BEGIN CURCHAR:=GETOUTPUT;
21:CASE CURCHAR OF 0:;
{101}65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,
87,88,89,90:BEGIN OUTCONTRIB[1]:=CURCHAR;SENDOUT(2,1);END;
97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115
,116,117,118,119,120,121,122:BEGIN OUTCONTRIB[1]:=CURCHAR-32;
SENDOUT(2,1);END;130:BEGIN K:=0;J:=BYTESTART[CURVAL];
WHILE(K<MAXIDLENGTH)AND(J<BYTESTART[CURVAL+1])DO BEGIN K:=K+1;
OUTCONTRIB[K]:=BYTEMEM[J];J:=J+1;
IF OUTCONTRIB[K]>=97 THEN OUTCONTRIB[K]:=OUTCONTRIB[K]-32 ELSE IF
OUTCONTRIB[K]=24 THEN K:=K-1;END;SENDOUT(2,K);END;
{103}48,49,50,51,52,53,54,55,56,57:BEGIN N:=0;REPEAT N:=10*N+CURCHAR-48;
CURCHAR:=GETOUTPUT;UNTIL(CURCHAR>57)OR(CURCHAR<48);SENDVAL(N);K:=0;
IF CURCHAR=101 THEN CURCHAR:=69;IF CURCHAR=69 THEN GOTO 2 ELSE GOTO 21;
END;12:BEGIN N:=0;CURCHAR:=48;REPEAT N:=8*N+CURCHAR-48;
CURCHAR:=GETOUTPUT;UNTIL(CURCHAR>55)OR(CURCHAR<48);SENDVAL(N);GOTO 21;
END;128:SENDVAL(CURVAL);46:BEGIN K:=1;OUTCONTRIB[1]:=46;
CURCHAR:=GETOUTPUT;IF CURCHAR=46 THEN BEGIN OUTCONTRIB[2]:=46;
SENDOUT(1,2);
END ELSE IF(CURCHAR>=48)AND(CURCHAR<=57)THEN GOTO 2 ELSE BEGIN SENDOUT(0
,46);GOTO 21;END;END;43,45:SENDSIGN(44-CURCHAR);
{99}4:BEGIN OUTCONTRIB[1]:=65;OUTCONTRIB[2]:=78;OUTCONTRIB[3]:=68;
SENDOUT(2,3);END;5:BEGIN OUTCONTRIB[1]:=78;OUTCONTRIB[2]:=79;
OUTCONTRIB[3]:=84;SENDOUT(2,3);END;6:BEGIN OUTCONTRIB[1]:=73;
OUTCONTRIB[2]:=78;SENDOUT(2,2);END;31:BEGIN OUTCONTRIB[1]:=79;
OUTCONTRIB[2]:=82;SENDOUT(2,2);END;95:BEGIN OUTCONTRIB[1]:=58;
OUTCONTRIB[2]:=61;SENDOUT(1,2);END;27:BEGIN OUTCONTRIB[1]:=60;
OUTCONTRIB[2]:=62;SENDOUT(1,2);END;28:BEGIN OUTCONTRIB[1]:=60;
OUTCONTRIB[2]:=61;SENDOUT(1,2);END;29:BEGIN OUTCONTRIB[1]:=62;
OUTCONTRIB[2]:=61;SENDOUT(1,2);END;30:BEGIN OUTCONTRIB[1]:=61;
OUTCONTRIB[2]:=61;SENDOUT(1,2);END;32:BEGIN OUTCONTRIB[1]:=46;
OUTCONTRIB[2]:=46;SENDOUT(1,2);END;39:{102}BEGIN K:=1;OUTCONTRIB[1]:=39;
REPEAT IF K<LINELENGTH THEN K:=K+1;OUTCONTRIB[K]:=GETOUTPUT;
UNTIL(OUTCONTRIB[K]=39)OR(STACKPTR=0);
IF K=LINELENGTH THEN BEGIN WRITELN(TTY);WRITE(TTY,'! String too long');
ERROR;END;SENDOUT(1,K);CURCHAR:=GETOUTPUT;
IF CURCHAR=39 THEN OUTSTATE:=6;GOTO 21;END;
{100}33,34,35,36,37,38,40,41,42,44,47,58,59,60,61,62,63,64,91,92,93,94,
24,96,123,124,126:SENDOUT(0,CURCHAR);
{105}9:BEGIN IF BRACELEVEL=0 THEN SENDOUT(0,123)ELSE SENDOUT(0,91);
BRACELEVEL:=BRACELEVEL+1;END;
10:IF BRACELEVEL>0 THEN BEGIN BRACELEVEL:=BRACELEVEL-1;
IF BRACELEVEL=0 THEN SENDOUT(0,126)ELSE SENDOUT(0,93);
END ELSE BEGIN WRITELN(TTY);WRITE(TTY,'! Extra @}');ERROR;END;
129:IF BRACELEVEL=0 THEN BEGIN SENDOUT(0,123);SENDVAL(CURVAL);
SENDOUT(0,126);END ELSE BEGIN SENDOUT(0,91);SENDVAL(CURVAL);
SENDOUT(0,93);END;127:BEGIN SENDOUT(3,0);OUTSTATE:=6;END;
OTHERS:BEGIN WRITELN(TTY);
WRITE(TTY,'! Can''t output ascii code ',CURCHAR:0);ERROR;END END;
GOTO 22;2:{104}REPEAT IF K<LINELENGTH THEN K:=K+1;
OUTCONTRIB[K]:=CURCHAR;CURCHAR:=GETOUTPUT;
IF(OUTCONTRIB[K]=69)AND((CURCHAR=43)OR(CURCHAR=45))THEN BEGIN IF K<
LINELENGTH THEN K:=K+1;OUTCONTRIB[K]:=CURCHAR;CURCHAR:=GETOUTPUT;
END ELSE IF CURCHAR=101 THEN CURCHAR:=69;
UNTIL(CURCHAR<>69)AND((CURCHAR<48)OR(CURCHAR>57));
IF K=LINELENGTH THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Fraction too long');ERROR;END;SENDOUT(3,K);GOTO 21;22:END;
END;{109}PROCEDURE GETLINE;BEGIN IF BUFFER[0]=12 THEN LINE:=0;
IF INPUTLN THEN BEGIN IF LINE=0 THEN BEGIN PAGE:=PAGE+1;
WRITE(TTY,PAGE:0,' ');
{110}IF(PAGE=1)AND(LIMIT=29)THEN IF(BUFFER[0]=67)AND(BUFFER[8]=22)THEN
REPEAT IF INPUTLN THEN ELSE BEGIN LIMIT:=0;BUFFER[0]:=12;END;
UNTIL BUFFER[0]=12;END;IF BUFFER[LIMIT]=13 THEN BUFFER[LIMIT]:=32;
END ELSE IF BUFFER[0]<>12 THEN BEGIN LIMIT:=0;BUFFER[0]:=12;
END ELSE INPUTHASENDE:=TRUE;LINE:=LINE+1;LOC:=0;END;
{111}FUNCTION CONTROLCODE(C:ASCIICODE):EIGHTBITS;
BEGIN CASE C OF 64:CONTROLCODE:=64;39:CONTROLCODE:=12;
32,9,42:CONTROLCODE:=137;68,100:CONTROLCODE:=133;
70,102:CONTROLCODE:=132;123:CONTROLCODE:=9;126:CONTROLCODE:=10;
80,112:CONTROLCODE:=134;84,116,94,46:CONTROLCODE:=131;
38:CONTROLCODE:=127;60:CONTROLCODE:=135;OTHERS:CONTROLCODE:=0 END;END;
{112}FUNCTION SKIPAHEAD:EIGHTBITS;LABEL 30;VAR C:EIGHTBITS;
BEGIN WHILE TRUE DO BEGIN IF LOC>LIMIT THEN BEGIN GETLINE;
IF BUFFER[0]=12 THEN BEGIN LOC:=1;C:=136;GOTO 30;END;END;
BUFFER[LIMIT+1]:=64;WHILE BUFFER[LOC]<>64 DO LOC:=LOC+1;
IF LOC<=LIMIT THEN BEGIN LOC:=LOC+2;C:=CONTROLCODE(BUFFER[LOC-1]);
IF(C<>0)OR(BUFFER[LOC-1]=62)THEN GOTO 30;END;END;30:SKIPAHEAD:=C;END;
{113}PROCEDURE SKIPCOMMENT;LABEL 10;VAR BAL:EIGHTBITS;C:ASCIICODE;
BEGIN BAL:=0;WHILE TRUE DO BEGIN IF LOC>LIMIT THEN BEGIN GETLINE;
IF BUFFER[0]=12 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Page ended in mid-comment');ERROR;END;LOC:=1;GOTO 10;END;
END;C:=BUFFER[LOC];LOC:=LOC+1;{114}IF C=64 THEN BEGIN C:=BUFFER[LOC];
IF(C<>32)AND(C<>9)AND(C<>42)THEN LOC:=LOC+1 ELSE BEGIN BEGIN WRITELN(TTY
);WRITE(TTY,'! Module ended in mid-comment');ERROR;END;LOC:=LOC-1;
GOTO 10;
END END ELSE IF(C=92)AND(BUFFER[LOC]<>64)THEN LOC:=LOC+1 ELSE IF C=123
THEN BAL:=BAL+1 ELSE IF C=126 THEN BEGIN IF BAL=0 THEN GOTO 10;
BAL:=BAL-1;END;END;10:END;{116}FUNCTION GETNEXT:EIGHTBITS;LABEL 20,30;
VAR C:EIGHTBITS;D:EIGHTBITS;J,K:0..LONGESTNAME;
BEGIN 20:IF LOC>LIMIT THEN GETLINE;C:=BUFFER[LOC];LOC:=LOC+1;
CASE C OF 65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85
,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111
,112,113,114,115,116,117,118,119,120,121,122:{118}BEGIN LOC:=LOC-1;
IDFIRST:=LOC;REPEAT LOC:=LOC+1;D:=BUFFER[LOC];
UNTIL((D<48)OR((D>57)AND(D<65))OR((D>90)AND(D<97))OR(D>122))AND(D<>24);
IF LOC>IDFIRST+1 THEN BEGIN C:=130;IDLOC:=LOC;END;END;
34:{119}BEGIN DOUBLECHARS:=0;IDFIRST:=LOC-1;REPEAT D:=BUFFER[LOC];
LOC:=LOC+1;IF(D=34)OR(D=64)THEN IF BUFFER[LOC]=D THEN BEGIN LOC:=LOC+1;
D:=0;DOUBLECHARS:=DOUBLECHARS+1;
END ELSE IF D=64 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Double @ sign missing');ERROR;
END ELSE IF LOC>LIMIT THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! String constant didn''t end');ERROR;END;D:=34;END;
UNTIL D=34;IDLOC:=LOC-1;C:=130;END;
64:{120}BEGIN C:=CONTROLCODE(BUFFER[LOC]);LOC:=LOC+1;
IF C=0 THEN GOTO 20 ELSE IF C=135 THEN{121}BEGIN{123}K:=0;
WHILE TRUE DO BEGIN IF LOC>LIMIT THEN BEGIN GETLINE;
IF BUFFER[0]=12 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Page ended in module name');ERROR;END;LOC:=1;GOTO 30;END;
END;D:=BUFFER[LOC];{124}IF D=64 THEN BEGIN D:=BUFFER[LOC+1];
IF D=62 THEN BEGIN LOC:=LOC+2;GOTO 30;END;
IF(D=32)OR(D=9)OR(D=42)THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Module name didn''t end');ERROR;END;GOTO 30;END;K:=K+1;
MODULE[K]:=64;LOC:=LOC+1;END;LOC:=LOC+1;IF K<LONGESTNAME-1 THEN K:=K+1;
IF(D=32)OR(D=9)THEN BEGIN D:=32;IF MODULE[K-1]=32 THEN K:=K-1;END;
MODULE[K]:=D;END;
30:{125}IF K>=LONGESTNAME-2 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Module name too long: ');END;
FOR J:=1 TO 25 DO WRITE(TTY,CHR(MODULE[J]));WRITE(TTY,'...');END;
IF(MODULE[K]=32)AND(K>0)THEN K:=K-1;;
IF K>3 THEN BEGIN IF(MODULE[K]=46)AND(MODULE[K-1]=46)AND(MODULE[K-2]=46)
THEN CURMODULE:=PREFIXLOOKUP(K-3)ELSE CURMODULE:=MODLOOKUP(K);
END ELSE CURMODULE:=MODLOOKUP(K);
END ELSE IF C=131 THEN BEGIN REPEAT C:=SKIPAHEAD;UNTIL C<>64;
IF BUFFER[LOC-1]<>62 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Improper @ within control text');ERROR;END;GOTO 20;END;END;
{117}46:IF BUFFER[LOC]=46 THEN BEGIN C:=32;LOC:=LOC+1;END;
58:IF BUFFER[LOC]=61 THEN BEGIN C:=95;LOC:=LOC+1;END;
61:IF BUFFER[LOC]=61 THEN BEGIN C:=30;LOC:=LOC+1;END;
62:IF BUFFER[LOC]=61 THEN BEGIN C:=29;LOC:=LOC+1;END;
60:IF BUFFER[LOC]=61 THEN BEGIN C:=28;LOC:=LOC+1;
END ELSE IF BUFFER[LOC]=62 THEN BEGIN C:=27;LOC:=LOC+1;END;
40:IF BUFFER[LOC]=42 THEN BEGIN C:=9;LOC:=LOC+1;END;
42:IF BUFFER[LOC]=41 THEN BEGIN C:=10;LOC:=LOC+1;END;32,9:GOTO 20;
123:BEGIN SKIPCOMMENT;GOTO 20;END;12:C:=136;OTHERS:END;
{IF TROUBLESHOOT THEN DEBUGHELP;}GETNEXT:=C;END;
{127}PROCEDURE SCANNUMERIC(P:NAMEPOINTER);LABEL 21,30;
VAR ACCUMULATOR:INTEGER;NEXTSIGN:-1..+1;Q:NAMEPOINTER;VAL:INTEGER;
PROCEDURE ADDIN(V:INTEGER);BEGIN ACCUMULATOR:=ACCUMULATOR+NEXTSIGN*V;
NEXTSIGN:=+1;END;BEGIN{128}ACCUMULATOR:=0;NEXTSIGN:=+1;
WHILE TRUE DO BEGIN NEXTCONTROL:=GETNEXT;
21:CASE NEXTCONTROL OF 48,49,50,51,52,53,54,55,56,57:BEGIN{130}VAL:=0;
REPEAT VAL:=10*VAL+NEXTCONTROL-48;NEXTCONTROL:=GETNEXT;
UNTIL(NEXTCONTROL>57)OR(NEXTCONTROL<48);;ADDIN(VAL);GOTO 21;END;
12:BEGIN{131}VAL:=0;NEXTCONTROL:=48;REPEAT VAL:=8*VAL+NEXTCONTROL-48;
NEXTCONTROL:=GETNEXT;UNTIL(NEXTCONTROL>55)OR(NEXTCONTROL<48);;
ADDIN(VAL);GOTO 21;END;130:BEGIN Q:=IDLOOKUP(0);
IF ILK[Q]<>1 THEN BEGIN NEXTCONTROL:=42;GOTO 21;END;
ADDIN(EQUIV[Q]-32768);END;43:;45:NEXTSIGN:=-NEXTSIGN;
132,133,135,134,136,137:GOTO 30;59:BEGIN WRITELN(TTY);
WRITE(TTY,'! Omit semicolon in numeric definition');ERROR;END;
OTHERS:{129}BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Improper numeric definition will be flushed');ERROR;END;
REPEAT NEXTCONTROL:=SKIPAHEAD UNTIL(NEXTCONTROL>=132);
IF NEXTCONTROL=135 THEN BEGIN LOC:=LOC-2;NEXTCONTROL:=GETNEXT;END;
ACCUMULATOR:=0;GOTO 30;END END;END;30:;
IF ABS(ACCUMULATOR)>=32768 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Value too big: ',ACCUMULATOR:0);ERROR;END;ACCUMULATOR:=0;
END;EQUIV[P]:=ACCUMULATOR+32768;END;
{134}PROCEDURE SCANREPL(T:EIGHTBITS);LABEL 22,30,31;VAR A:SIXTEENBITS;
B:ASCIICODE;BAL:EIGHTBITS;BEGIN BAL:=0;
WHILE TRUE DO BEGIN 22:A:=GETNEXT;CASE A OF 40:BAL:=BAL+1;
41:IF BAL=0 THEN BEGIN WRITELN(TTY);WRITE(TTY,'! Extra )');ERROR;
END ELSE BAL:=BAL-1;39:{137}BEGIN B:=39;
WHILE TRUE DO BEGIN BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=B;TOKPTR:=TOKPTR+1;END;
IF B=64 THEN IF BUFFER[LOC]=64 THEN LOC:=LOC+1 ELSE BEGIN WRITELN(TTY);
WRITE(TTY,'! You should double @ signs in strings');ERROR;END;
IF LOC=LIMIT THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! String didn''t end');ERROR;END;BUFFER[LOC]:=39;
BUFFER[LOC+1]:=0;END;B:=BUFFER[LOC];LOC:=LOC+1;
IF B=39 THEN BEGIN IF BUFFER[LOC]<>39 THEN GOTO 31 ELSE BEGIN LOC:=LOC+1
;BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=39;TOKPTR:=TOKPTR+1;END;END;END;END;31:END;
35:IF T=3 THEN A:=13;{136}130:BEGIN A:=IDLOOKUP(0);
BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=(A DIV 256)+128;TOKPTR:=TOKPTR+1;END;A:=A MOD 256;END;
135:IF T<>135 THEN GOTO 30 ELSE BEGIN BEGIN IF TOKPTR=MAXTOKS THEN BEGIN
WRITELN(TTY);WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;
QUIT;END;TOKMEM[TOKPTR]:=(CURMODULE DIV 256)+168;TOKPTR:=TOKPTR+1;END;
A:=CURMODULE MOD 256;END;
133,132,134:IF T<>135 THEN GOTO 30 ELSE BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! @',CHR(BUFFER[LOC-1]),' is ignored in PASCAL text');ERROR;
END;GOTO 22;END;136,137:GOTO 30;OTHERS:END;
BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=A;TOKPTR:=TOKPTR+1;END;END;30:NEXTCONTROL:=A;
{135}IF BAL>0 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Missing ',BAL:0,' )');ERROR;END;
WHILE BAL>0 DO BEGIN BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=41;TOKPTR:=TOKPTR+1;END;BAL:=BAL-1;END;END;
IF TEXTPTR=MAXTEXTS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','text',' capacity exceeded');ERROR;QUIT;END;
CURREPLTEXT:=TEXTPTR;TEXTPTR:=TEXTPTR+1;TOKSTART[TEXTPTR]:=TOKPTR;END;
{138}PROCEDURE DEFINEMACRO(T:EIGHTBITS);VAR P:NAMEPOINTER;
BEGIN P:=IDLOOKUP(T);SCANREPL(T);EQUIV[P]:=CURREPLTEXT;
TEXTLINK[CURREPLTEXT]:=0;END;{140}PROCEDURE SCANMODULE;LABEL 30,10;
VAR P:NAMEPOINTER;BEGIN MODULECOUNT:=MODULECOUNT+1;{141}NEXTCONTROL:=0;
WHILE TRUE DO BEGIN 22:WHILE NEXTCONTROL<=132 DO BEGIN NEXTCONTROL:=
SKIPAHEAD;IF NEXTCONTROL=135 THEN BEGIN LOC:=LOC-2;NEXTCONTROL:=GETNEXT;
END;END;IF NEXTCONTROL<>133 THEN GOTO 30;NEXTCONTROL:=GETNEXT;
IF NEXTCONTROL<>130 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Definition flushed, must start with ',
'identifier of length > 1');ERROR;END;GOTO 22;END;NEXTCONTROL:=GETNEXT;
IF NEXTCONTROL=61 THEN BEGIN SCANNUMERIC(IDLOOKUP(1));GOTO 22;
END ELSE IF NEXTCONTROL=30 THEN BEGIN DEFINEMACRO(2);GOTO 22;
END ELSE{142}IF NEXTCONTROL=40 THEN BEGIN NEXTCONTROL:=GETNEXT;
IF NEXTCONTROL=35 THEN BEGIN NEXTCONTROL:=GETNEXT;
IF NEXTCONTROL=41 THEN BEGIN NEXTCONTROL:=GETNEXT;
IF NEXTCONTROL=61 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Use == for macros');ERROR;END;NEXTCONTROL:=30;END;
IF NEXTCONTROL=30 THEN BEGIN DEFINEMACRO(3);GOTO 22;END;END;END;END;;
BEGIN WRITELN(TTY);
WRITE(TTY,'! Definition flushed since it starts badly');ERROR;END;END;
30:;{143}CASE NEXTCONTROL OF 134:P:=0;135:BEGIN P:=CURMODULE;
{144}REPEAT NEXTCONTROL:=GETNEXT;UNTIL NEXTCONTROL<>43;
IF(NEXTCONTROL<>61)AND(NEXTCONTROL<>30)THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! PASCAL text flushed, = sign is missing');ERROR;END;
REPEAT NEXTCONTROL:=SKIPAHEAD;UNTIL NEXTCONTROL>=136;GOTO 10;END;END;
OTHERS:GOTO 10 END;{145}STORETWOBYTE(53248+MODULECOUNT);;SCANREPL(135);
{146}IF P=0 THEN BEGIN TEXTLINK[LASTUNNAMED]:=CURREPLTEXT;
LASTUNNAMED:=CURREPLTEXT;
END ELSE IF EQUIV[P]=0 THEN EQUIV[P]:=CURREPLTEXT ELSE BEGIN P:=EQUIV[P]
;WHILE TEXTLINK[P]<MAXTEXTS DO P:=TEXTLINK[P];TEXTLINK[P]:=CURREPLTEXT;
END;TEXTLINK[CURREPLTEXT]:=MAXTEXTS;;;10:END;{149}{PROCEDURE DEBUGHELP;
LABEL 888,10;VAR K:SIXTEENBITS;BEGIN DEBUGSKIPPED:=DEBUGSKIPPED+1;
IF DEBUGSKIPPED<DEBUGCYCLE THEN GOTO 10;DEBUGSKIPPED:=0;888:
['*****************************breakpoint*****************************']
WHILE TRUE DO BEGIN WRITE(TTY,'#');READ(TTY,DDT);
IF DDT<0 THEN GOTO 10 ELSE IF DDT=0 THEN GOTO 888;READ(TTY,DD);
CASE DDT OF 1:PRINTID(DD);2:PRINTREPL(DD);
3:FOR K:=1 TO DD DO WRITE(TTY,CHR(BUFFER[K]));
4:FOR K:=1 TO DD DO WRITE(TTY,CHR(MODULE[K]));
5:FOR K:=1 TO OUTPTR DO WRITE(TTY,CHR(OUTBUF[K]));
6:FOR K:=1 TO DD DO WRITE(TTY,CHR(OUTCONTRIB[K]));
OTHERS:WRITE(TTY,'?')END;END;10:END;}{150}BEGIN INITIALIZE;
{108}IF OPENINPUT THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Couldn''t open the input file.');END;QUIT;END;PAGE:=0;
LINE:=0;LIMIT:=0;LOC:=1;BUFFER[0]:=32;INPUTHASENDE:=FALSE;;
{151}PHASEONE:=TRUE;MODULECOUNT:=0;REPEAT NEXTCONTROL:=SKIPAHEAD;
WHILE NEXTCONTROL=137 DO SCANMODULE;UNTIL INPUTHASENDE;PHASEONE:=FALSE;;
{MAXTOKPTR:=TOKPTR;}{97}IF TEXTLINK[0]=0 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! No output was specified.');
END ELSE BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'Writing the output file...');END;{68}STACKPTR:=1;
BRACELEVEL:=0;CURSTATE.NAMEFIELD:=0;CURSTATE.REPLFIELD:=TEXTLINK[0];
CURSTATE.BYTEFIELD:=TOKSTART[CURSTATE.REPLFIELD];
CURSTATE.ENDFIELD:=TOKSTART[CURSTATE.REPLFIELD+1];;{81}OUTSTATE:=0;
OUTPTR:=0;BREAKPTR:=0;SEMIPTR:=0;OUTBUF[0]:=0;LINE:=1;;SENDTHEOUTPU;
{83}IF(OUTSTATE<>0)OR(OUTBUF[BREAKPTR]<>46)THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Program didn''t end with period');ERROR;END;
BREAKPTR:=OUTPTR;SEMIPTR:=0;FLUSHBUFFER;;BEGIN WRITELN(TTY);
WRITE(TTY,'Done.');END;END;
9999:IF STRINGPTR>128 THEN BEGIN WRITELN(TTY);
WRITE(TTY,STRINGPTR-128:0,' strings written to string pool file.');END;
{[152]BEGIN WRITELN(TTY);WRITE(TTY,'Memory usage statistics:');END;
BEGIN WRITELN(TTY);
WRITE(TTY,NAMEPTR:0,' names, ',TEXTPTR:0,' replacement texts;');END;
BEGIN WRITELN(TTY);
WRITE(TTY,BYTEPTR:0,' bytes, ',MAXTOKPTR:0,' tokens.');END;;}END.